
#include "GestionTiposObjetos.h"

void TipoObjetoEstatico::Inicializar(int ancho, int alto, vector<Animacion_y> v_animaciones, bool tipoEspejada) {
	
	this->ancho = ancho;
	this->alto = alto;
	
	for (unsigned int k=0; k<v_animaciones.size(); k++) {
			
		infoAnimacion_t animacion;

		animacion.descripcion = v_animaciones[k].descripcion;
		animacion.archivo = v_animaciones[k].archivo;
		animacion.periodo = v_animaciones[k].periodo;
		animacion.cuadros = v_animaciones[k].cuadros;
		animacion.idImagen = GestionId::getId(animacion.archivo, ancho, alto, animacion.cuadros, tipoEspejada);
		
		animaciones.push_back(animacion);
	}
}

void TipoObjetoEstatico::AsignarAObjeto(ObjetoEstatico* objetoEstatico) {
	
	objetoEstatico->setAncho(ancho);
	objetoEstatico->setAlto(alto);
	
	for (unsigned int k=0; k<animaciones.size(); k++) {
		objetoEstatico->addAnimacion(animaciones[k].idImagen, animaciones[k].periodo, animaciones[k].cuadros);
	}
}

void TipoObjetoMovible::Inicializar(int ancho, int alto, vector<Animacion_y> v_animaciones, vector<string> descripcionAcciones, int velocidad, int salto, bool tipoEspejada) {
	
	this->ancho = ancho;
	this->alto = alto;
	this->velocidad = velocidad;
	this->salto = salto;
	
	infoAccion_t v_acciones[descripcionAcciones.size()];
	
	for (unsigned int k=0; k<v_animaciones.size(); k++) {

		string descripcion = v_animaciones[k].descripcion;
		unsigned int posicion = find(descripcionAcciones.begin(), descripcionAcciones.end(), descripcion.c_str()) - descripcionAcciones.begin();
		
		if (posicion < descripcionAcciones.size()) {
			
			infoAccion_t accion;
			
			accion.descripcion  = descripcion;
			accion.archivo = v_animaciones[k].archivo;
			accion.cuadros = v_animaciones[k].cuadros;
			accion.idImagen = GestionId::getId(accion.archivo, ancho, alto, accion.cuadros, tipoEspejada);
			
			v_acciones[posicion] = accion;
		}

		else {
			
			infoAnimacion_t animacion;

			animacion.descripcion = descripcion;
			animacion.archivo = v_animaciones[k].archivo;
			animacion.periodo = v_animaciones[k].periodo;
			animacion.cuadros = v_animaciones[k].cuadros;
			animacion.idImagen = GestionId::getId(animacion.archivo, ancho, alto, animacion.cuadros, tipoEspejada);
			
			animaciones.push_back(animacion);
		}
	}
	
	for (unsigned int i=0; i<descripcionAcciones.size(); i++) {
		acciones.push_back(v_acciones[i]);
	}
}

void TipoObjetoMovible::AsignarAObjeto(ObjetoMovible* objetoMovible) {
	
	objetoMovible->setAncho(ancho);
	objetoMovible->setAlto(alto);
	objetoMovible->setVelocidad(velocidad);
	objetoMovible->setSalto(salto);

	for (unsigned int k=0; k<acciones.size(); k++) {
		objetoMovible->addAccion(acciones[k].idImagen, acciones[k].cuadros);
	}
	
	for (unsigned int k=0; k<animaciones.size(); k++) {
		objetoMovible->addAnimacion(animaciones[k].idImagen, animaciones[k].periodo, animaciones[k].cuadros);
	}
}

vector<infoAccion_t> AsignarParticulares(int ancho, int alto, vector<string> descripcionParticulares, vector<Animacion_y>* animaciones, bool tipoEspejada) {
	
	infoAccion_t initialize = {"", "", 0, 0};
	vector<infoAccion_t> v_accionesParticulares(descripcionParticulares.size(), initialize);
	
	for (unsigned int k=0; k<animaciones->size(); k++) {
		
		string descripcion = animaciones->at(k).descripcion;

		unsigned int posicion = find(descripcionParticulares.begin(), descripcionParticulares.end(), descripcion.c_str()) - descripcionParticulares.begin();
		
		if (posicion < descripcionParticulares.size()) {
			
			infoAccion_t accion;
			
			accion.descripcion  = descripcion;
			accion.archivo = animaciones->at(k).archivo;
			accion.cuadros = animaciones->at(k).cuadros;
			accion.idImagen = GestionId::getId(accion.archivo, ancho, alto, accion.cuadros, tipoEspejada);
			
			v_accionesParticulares.at(posicion) = accion;
			animaciones->erase(animaciones->begin() + k);
			k--;
		}
		
	}

	return v_accionesParticulares;
}
			
